package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

/**
 * @Description
 * @Author Colin
 * @Date 2021/12/2 9:20 上午
 * @Version 1.0
 */

func main() {
	r := gin.Default() //初始化一个http服务对象
	//r.GET("/hi", func(context *gin.Context) {
	//	//通过请求上下文对象context，直接往客户端返回一个json
	//	context.JSON(http.StatusOK, gin.H{
	//		"message": "hello world",
	//	})
	//})
	//
	////带参数，返回string
	//r.GET("/user/:id", func(context *gin.Context) {
	//	id := context.Param("id")
	//	log.Println(id)
	//	context.String(http.StatusOK, "hello%s", "colin")
	//})
	//
	//r.GET("/test_global_middleware",SelfDefineMiddleWare(), func(c *gin.Context) {
	//	fmt.Println("coming")
	//	value, _ := c.Get("key1")
	//	log.Fatal("value:",value)
	//	c.JSON(http.StatusOK,gin.H{"value":value})
	//})
	//
	//返回json xml
	r.GET("/json", func(context *gin.Context) {
		u := user{
			Name: "colin",
			Id:   "123",
		}
		//context.JSON(http.StatusOK,u)
		context.XML(http.StatusOK, u)
	})
	//
	////上传文件
	////设置文件上传大小限制 默认32m
	//r.MaxMultipartMemory = 64 << 20 //64mib
	//
	//r.POST("/upload", func(c *gin.Context) {
	//	file, err := c.FormFile("file")
	//	if err != nil {
	//		log.Panic(err)
	//	}
	//	//打印上传的文件名
	//	log.Println(file.Filename)
	//	//将上传的文件保存到./upload/1111.jpg文件中
	//	path := "./upload/" + file.Filename
	//	c.SaveUploadedFile(file, path)
	//	c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!!!", file.Filename))
	//})
	//
	////多个文件上传
	//r.POST("/upload_multi", func(c *gin.Context) {
	//	form, err := c.MultipartForm()
	//	if err != nil {
	//		log.Panic(err)
	//	}
	//
	//	files := form.File["files"]
	//	for _, file := range files {
	//		log.Println(file.Filename)
	//		path := "./upload/" + file.Filename
	//
	//		if err := c.SaveUploadedFile(file, path); err != nil {
	//			log.Panic(err)
	//			return
	//		}
	//	}
	//	c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
	//})

	//全局中间件
	//r.Use(SelfDefineMiddleWare())
	//{
	//	r.GET("/ce", func(c *gin.Context) {
	//		// 取值
	//		value, _ := c.Get("key1")
	//		fmt.Println("value:", value)
	//		// 页面接收
	//		c.JSON(200, gin.H{"value": value})
	//	})
	//}

	//局部中间件
	r.GET("/partMid", SelfDefineMiddleWare(), func(c *gin.Context) {
		value, _ := c.Get("key1")
		fmt.Println("value", value)
		c.JSON(200, gin.H{"value": value})
	})

	r.GET("/test", func(c *gin.Context) {
		value, _ := c.Get("key1")
		fmt.Println("value", value)
		c.JSON(200, gin.H{"value": value})
	})

	//html渲染
	r.LoadHTMLGlob("template/**/*")
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "user/index.html", gin.H{"title": "我是测试", "address": "www.5lmh.com"})
	})

	//重定向
	r.GET("/abc", func(c *gin.Context) {
		c.Redirect(http.StatusFound, "http://www.baidu.com")
	})

	//Cookie
	r.GET("/cookie", func(c *gin.Context) {
		cookie, err := c.Cookie("key")
		if err != nil {
			cookie = "notset"
			// name ,key
			//value ,value
			//  maxAge int, 单位为秒
			// path,cookie所在目录
			// domain string,域名
			//   secure 是否智能通过https访问
			// httpOnly bool  是否允许别人通过js获取自己的cookie
			c.SetCookie("key", "value", 30, "/", "localhost", false, true)
		}
		fmt.Println("cookie的值：", cookie)
	})

	//结构体验证
	r.GET("/51mh", func(c *gin.Context) {
		//bir,_ := time.Parse("2006-01-02","1994-11-08")
		//person := Person{
		//	Age: 9,
		//	Name: "colin",
		//	Birthday: bir,
		//}
		var person Person
		if err := c.ShouldBind(&person); err != nil {
			c.String(500, fmt.Sprint(err))
			return
		}
		c.String(200, fmt.Sprintf("%#v", person))
	})

	r.Run()
}

type Person struct {
	Age  int    `form:"age",binding:"required,gt=10"`
	Name string `form:"name",binding:"required"`
	//Birthday time.Time `form:"birthday",time_format:"2011-01-01" time_utc:"1"`
}

type user struct {
	Name string `json:"name1"`
	Id   string `json:"id"`
}

// SelfDefineMiddleWare 中间件中使用log.Fatal 无法成功执行
func SelfDefineMiddleWare() gin.HandlerFunc {
	return func(c *gin.Context) {
		t1 := time.Now()
		fmt.Println("开始执行中间件", t1)
		c.Set("key1", "value1")
		status := c.Writer.Status()
		fmt.Println("结束中间件", status)
		t2 := time.Since(t1)
		fmt.Println("time:", t2)
	}
}
